import axios from 'axios';
import store from '@/store/index';
// 单独引入  Notification - 调用方法为 Notification(options)
import { Notification } from 'element-ui';
import { MessageBox } from 'element-ui';

// 导入响应错误枚举
import { responseErrorEnum } from './enum-http';

// 创建实例
const server = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 基本地址
  timeout: 20000, // 超时请求 - 断开连接时间 ms - 20s

  token: true,
  withCredentials: true
});

// 请求拦截器
server.interceptors.request.use(
  (config) => {
    const token = store.getters['user/token'];

    // 是否携带 token - 在 api的 header中添加 isToken标识 - 前端默认所有接口都是需要token的, 后端也要有鉴权判断
    const isTokenFlag = (config.headers || {}).isToken === false; // 逻辑比较判断 当 true - 不需要携带

    // 如果本地有token && api 需要携带token ; 就在请求头中增加 Authorization
    if (token && !isTokenFlag) {
      config.headers.Authorization = token; // 值通常是 'Bearer ' + token; 我这里后端直接返回了，因此直接赋值
    }

    // ...请求发起前的code - end
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
server.interceptors.response.use(
  (response) => {
    // console.log('正常响应拦截', response)
    const { data } = response;

    const code = data.code ?? 200; // 默认请求成功 200

    if (code !== 200) {
      const title = responseErrorEnum[code] ?? message;
      Notification.warning({
        title,
        message: data.message ?? '系统未知错误，请反馈给管理员'
      });
    }

    // 响应返回前的code - end
    return response.data;
  },
  (error) => {
    console.log('服务器响应异常-throw异常', error);

    const { message, response: errResponse } = error;

    if (errResponse.status === 401) {
      const text = '登录状态已过期，您可以继续留在该页面，或者重新登录';
      const options = {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'info'
      };
      MessageBox.confirm(text, '系统提示', options)
        .then(() => {
          location.href = '/login';
        })
        .catch((err) => {
          console.log(err);
        });
    } else {
      const title = responseErrorEnum[errResponse.status] ?? message;
      Notification.error({
        title,
        message: errResponse.data ?? '系统未知错误，请反馈给管理员'
      });
    }

    return Promise.reject(error);
  }
);

// 导出模块
export default server;
